package cn.jlonely.xyhx.admin.service.impl;

import cn.jlonely.xyhx.admin.service.AnalysisService;
import cn.jlonely.xyhx.pojo.VoteData;
import cn.jlonely.xyhx.utils.AnalysisResult;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONException;
import org.springframework.ai.openai.OpenAiChatModel;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class AnalysisServiceImpl implements AnalysisService {

    private final OpenAiChatModel chatModel; // Spring AI 注入

    public AnalysisServiceImpl(OpenAiChatModel chatModel) {
        this.chatModel = chatModel;
    }

    public AnalysisResult generateReport(List<VoteData> data) {
        // 1. 生成分析提示词
        String prompt = buildAnalysisPrompt(data);

        // 2. 调用 AI 获取返回值
        String jsonResult = chatModel.call(prompt);

        // 3. 预处理 JSON 数据
        jsonResult = jsonResult.trim();

        // 去掉不必要的 "json" 或其他前缀
        if (jsonResult.startsWith("json")) {
            jsonResult = jsonResult.substring(4).trim();
        }

        // 去掉首尾的多余换行符或空格
        jsonResult = jsonResult.replaceAll("[\\n\\r]+", "");

        // 去掉 Markdown 代码块标记
        if (jsonResult.startsWith("```json")) {
            jsonResult = jsonResult.substring(7).trim();
        }
        if (jsonResult.endsWith("```")) {
            jsonResult = jsonResult.substring(0, jsonResult.length() - 3).trim();
        }

        // 4. 尝试解析 JSON
        try {
            return JSON.parseObject(jsonResult, AnalysisResult.class);
        } catch (JSONException e) {
            throw new RuntimeException("AI 返回的 JSON 解析失败，内容: " + jsonResult, e);
        }
    }


    private String buildAnalysisPrompt(List<VoteData> data) {
        StringBuilder sb = new StringBuilder();
        sb.append("你是一个数据分析专家，请根据以下投票数据生成 JSON 格式的分析报告。\n");
        data.forEach(d -> sb.append(
                String.format("ID:%d 标题:%s 票数:%d 提交人:%s\n",
                        d.getId(), d.getTopic(), d.getNumber(), d.getRealName()))
        );

        sb.append("""
                请严格按照以下 JSON 格式输出（不要输出任何其他文字）：
                {
                  "analysisPoints": [
                    {
                      "title": "最高票数项目优势分析",
                      "content": ["分析点1", "分析点2", "分析点3"]
                    },
                    {
                      "title": "前3名项目对比分析",
                      "content": ["对比点1", "对比点2", "对比点3"]
                    },
                    {
                      "title": "数据异常检测",
                      "content": ["异常点1", "异常点2", "异常点3"]
                    }
                  ],
                  "summary": "分析总结"
                }
                你的回答必须是合法 JSON，不能包含额外的解释文本。
                """);
        return sb.toString();
    }
}
